const PENDIND = 'pending';
const RESOLVED = 'resolved';
const REJECTED = 'rejected';

function myPromise(fn) {
    // 保存初始化状态
    let self = this;

    // 定义初始状态为pending
    this.state = PENDIND;

    // 用于保存resolve reject传入的值
    this.value = null;
    // 用于保存resolve和reject的回调函数
    this.resolvedCallbacks = [];
    this.rejectedCallbacks = [];

    // 状态转为resolve的处理方法
    function resolve(value) {
        // 判断传入元素是否为 Promise 值，如果是，则状态改变必须等待前一个状态改变后再进行改变
        if (value instanceof myPromise) {
            return value.then(resolve, reject); 
        }

        // 保证代码的执行顺序为本轮事件循环的末尾
        setTimeout(() => {
            if (self.state === PENDIND) {
                // 修改状态
                self.state = RESOLVED;

                // 保存传入的值
                self.value = value;

                // 执行回调函数
                resolvedCallbacks.forEach(callback => callback(value));
            }
        }, 0);
    };

    // 状态转变为rejected的处理方法
    function reject(reason) {
        setTimeout(() => {
            if (self.state === PENDIND) {
                self.state = REJECTED;
                self.value = reason;
                rejectedCallbacks.forEach(callback => callback(reason));
            }
        }, 0)
    };


    // 把两个函数传入fn
    try {
        fn(resolve, reject);
    } catch (err) {
        // 遇到错误时，捕获错误，执行 reject 函数
        reject(err);
    };
}